#!/bin/bash

#
#1、直接执行文件为打印选项列表；
#2、修改选项时，文件接收两个参数，第一个参数为option序号，第二个参数为 enable/disable
#

dir="$(dirname "$0")"
if [[ "$UID" -ne 0 ]];then
	echo "Need root pomission"
fi
configFile=$dir/config
#configFile=$dir/config/config
#config文件不存则在生成文件，生成失败退出程序
if [ ! -e $configFile ];then
	#echo "Not found config file, creating now !"
	$dir/setuptool.sh rom.bin export
	#echo $?
	if [[ $? -eq 0 ]];then
		chmod 777 $configFile
	else
		echo "Error: Failed to create config file, please check!"
		exit 1
	fi
else
	chmod 777 $configFile
fi

#读取文件菜单函数，第一个参数为要查询的菜单等级（层级越深数值越大）
function readMenu() {
menuLevel=0		#菜单等级
optionLine=0	#读取文件起始行号
menuOrder=0		#菜单序号

while read lines
do
	#记录读取位置行号
	optionLine=$(($optionLine+1))
	#判断是否为菜单行（包含 ：和 {）
	if [[ $lines =~ "{" && $lines =~ ":" ]]; then
		#将所有菜单输出(大于等于0级，即为所有菜单)
		if [[ $menuLevel -ge $1 ]]; then
			#截取冒号前面的内容作为menuName
			menuName=`sed -n $optionLine'p' $configFile | awk -F ':' '{print $1}'`
			#echo "Menu $menuOrder: $menuName"
			
			#记录读到菜单的 menuName 和所在行号 保存到数组，用来一下向下查询显示内容
			#下标为 菜单序号
			order[$menuOrder]=`echo $menuName`
			orderLine[$menuOrder]=`echo $optionLine`
			#菜单序号（从0开始）
			menuOrder=$(($menuOrder+1))
		fi
		#如果遇到{，说明还有子菜单，菜单等级+1
		if [[ $lines =~ "{" ]]; then
			menuLevel=$(($menuLevel+1))
		fi
	fi
	#遇到}，菜单等级-1
	if [[ $lines =~ "}" ]];then
		menuLevel=$(($menuLevel-1))
		#菜单等级小于输入查询的等级，退出（查询所有子菜单时注释掉该判断条件）
		#if [[ $menuLevel -lt $1 ]]; then
			#break
		#fi
	fi
	#菜单等级小于0时，退出
	if [[ $menuLevel -lt 0 ]]; then
		#echo "Menu lelve 1: $menuName"
		break
	fi
done < $configFile
}
#查询所有级菜单--将满足条件的菜单保存到order数组
readMenu 0


#echo ${order[*]}
#echo ${#orderLine[@]}

#遍历上一步得到的菜单数组，将满足条件的（enable/disable）的菜单保存的optionMenu数组
num=0
for i in `seq 0 $((${#order[@]}-1))`
do
	tipsLine=${orderLine[$i]}
	
	while true
	do
		tipsLine=$(($tipsLine+1))
		#读取行内容
		lineContent=`sed -n $tipsLine'p' $configFile`
		#菜单下面还有{，说明不是最深级菜单，结束while，继续下次for循环
		if [[ $lineContent =~ "{" ]];then
			#echo $lineContent"------break"
			break
		fi
		#有且仅有一个(移除重名菜单)
		notOnlyLine=`sed -n -e "/${order[$i]}/=" $configFile`
		#有空格说明不止一个(匹配成功返回0,否则返回1)
		echo $notOnlyLine | grep " " > /dev/null
		#echo $?
		if [[ $? -eq 0 ]];then
			break
		fi
		if [[ $lineContent =~ "tips" ]];then
			#echo $lineContent"-------tips"
			if [[ $lineContent =~ "Enabled" && $lineContent =~ "Disabled" ]];then
				optionMenu[$num]=`echo ${order[$i]}`
				num=$(($num+1))
				break
			elif [[ $lineContent =~ "On" && $lineContent =~ "Off" ]];then
				optionMenu[$num]=`echo ${order[$i]}`
				num=$(($num+1))
				break
			fi
			break
		fi
	done
done

#获取数组最后元素下标
maxOption=$((${#optionMenu[@]}-1))
#echo $maxOption
#不输入参数，打印帮助信息
if [ -z "$1" ];then
	echo "Usage:$0 + option + value"
	echo 'option		value			discription'

	for i in `seq 0 $maxOption`
	do
		echo "$i		enable/disable		${optionMenu[$i]}"
	done
	
	exit 0
fi
#输入option num超出范围，退出程序
if [[ $1 -lt 0 || $1 -gt $maxOption ]];then
	echo "Error: invalid option!"
	exit 1
fi
#echo "${optionMenu[$1]}"

#获取修改内容所在行行号
readLine=`sed -n -e "/${optionMenu[$1]}/=" $configFile`
echo $readLine

#向下找到value行
while true
do
	readLine=$(($readLine+1))
	#读取行内容
	lineContent=`sed -n $readLine'p' $configFile`
	if [[ $lineContent =~ '"value":' ]];then
		#获取value行冒号后面的数字
		val=`sed -n $readLine'p' $configFile | awk -F ':' '{print $2}'`
		#获取变量长度（#）
		#echo ${#val}
		#将readLine行中val值替换为所需值,@(/)为分隔符
		if [[ "$2" = "enable" ]];then
			sed -i "${readLine}s/$val/ 1/g" $configFile
			echo "Modified successfully!"
			break
		elif [[ "$2" = "disable" ]];then
			sed -i "${readLine}s/$val/ 0/g" $configFile
			echo "Modified successfully!"
			break
		else
			echo "Error: parameter is invalid!"
			break
		fi
	fi
done

exit 0